// 引入sha1模块
const sha1 = require('sha1');
// 引入config模块
const config = require('../config')
// 引入tool模块
const {getUserDataAsync, parseXmlAsync, formatMessage} = require('../utils/tool');
// 引入template模块
const template = require('./template');
// 引入reply模块
const reply = require('./reply');

module.exports = () => {

    return async (req, res, next) => {
        // 先验证有效性
        const {signature, echostr, timestamp, nonce} = req.query;
        const {token} = config;
        const arr = [timestamp, nonce, token];
        const arrSort = arr.sort();
        const str = arr.join('');
        const sha1Str = sha1(str);
        if (sha1Str != signature) {
            res.end('error');
        }

        // 获取用户发送的消息
        console.log(req.query);
        /*
        {   signature: 'e328df7534336b4f76a10448556c5341e6aa0ecd',
            timestamp: '1541639864',
            nonce: '1340713595',
            openid: 'owuCb1byYreqo9BEUwgVgJ1_0EPI' }
         */
        // 接收请求体中的数据
        const xmlData = await getUserDataAsync(req);
        console.log('xmlData-----------------------');
        console.log(xmlData);
        /*
        <xml>
            <ToUserName><![CDATA[gh_8272cf8371fd]]></ToUserName>
            <FromUserName><![CDATA[owuCb1byYreqo9BEUwgVgJ1_0EPI]]></FromUserName>
            <CreateTime>1541640555</CreateTime>   发送的时间戳
            <MsgType><![CDATA[text]]></MsgType>   发送消息类型
            <Content><![CDATA[购物车]]></Content> 发送内容
            <MsgId>6621295766370433398</MsgId>    消息id，微信服务器默认会保存3天用户发送的数据，通过此id3天内可以找到此消息数据，三天后就会被销毁
        </xml>
         */
        // 将xml数据解析为js对象
        const jsData = await parseXmlAsync(xmlData);
        console.log('jsData-----------------------');
        console.log(jsData);

        // 格式化数据
        const message = formatMessage(jsData);
        console.log('message-----------------------');
        console.log(message);

        const options = reply(message);
        console.log('options-----------------------');
        console.log(replyMessage);

        const replyMessage = template(options);
        console.log('replyMessage-----------------------');
        console.log(replyMessage);

        // 如果开发者服务器没有返回响应给微信服务器，微信服务器会发送三次请求过来
        res.send(replyMessage);
    };
}